package pers.mobian.aop;

import org.springframework.cglib.proxy.*;

import java.lang.reflect.Method;

/**
 * @Date 2021/10/10 19:37
 * @Created mobian
 * @Description
 */
public class CglibTest {
	public static void main(String[] args) {

		// 创建被代理的对象
		UserServiceImpl userService = new UserServiceImpl();

		// 创建一个Enhancer对象
		Enhancer enhancer = new Enhancer();

		// 设置对应的父子关系
		enhancer.setSuperclass(UserServiceImpl.class);

		// 创建MethodInterceptor对象数组,用于处理对应的代理逻辑
		enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {
			@Override
			// o 代理对象,即增强后的对象
			// objects 被代理对象的参数列表
			// methodProxy  cglib提供的代理方法对象
			public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
				System.out.println("开始代理逻辑");
				// 方式一: 使用cglib提供的代理方法进行执行调用
				Object result = methodProxy.invoke(userService, objects);

				// 方式二: 使用常规的反射方式进行调用
				Object result2 = method.invoke(userService, objects);

				// 方式三: 执行对应的增强后对象的代理方法进行调用
				Object result3 = methodProxy.invokeSuper(o, objects);


				System.out.println("结束代理逻辑");
				return result;
			}
		}});

		// 创建对应的代理对象
		UserServiceImpl instance = (UserServiceImpl) enhancer.create();

		// 调用show方法,此时会进入我们前面设置的Callback回调方法
		instance.show();
	}
}
